
#ifndef NODEVALIDATOR_HPP_
#define NODEVALIDATOR_HPP_

#include "../logger/logger.hpp"
#include "parser.hpp"
#include "controlNode.hpp"
#include "../main/graph.hpp"
//#include "../main/graphIterator.hpp"

/**
 * Clase NodeValidator encargada de la validacion de los
 * nodos.
 * Validaciones:
 *  - cantidad de campos
 *  - formato de los campos
 *  - insercion en el grafo (verifica exitencia de nodos
 *  con mismo id, y si existe algun nodo en la misma posicion
 *  que el nodo ingresante)
 *
 */
class NodeValidator{
private:
	Parser		parser;
	Logger		*logger;
	Graph		*graph;
	int			numberOfFieldsExpected;
	ControlNode	node;

public:

	/**
	 * Constructor por defecto de la clase NodeValidator.
	 */
	NodeValidator(){}

	/**
	 * Constructor parametrizado de la clase NodeValidator.
	 */
	NodeValidator(std::string &fileToParse, std::string &fileConf, Logger *log, int numberOfFields, Graph *graph);

	/**
	 * Destructor de la clase NodeValidator.
	 */
	virtual ~NodeValidator();

	/**
	 * Generador del contenido de la clase NodeValidator.
	 */
	void create(std::string &fileToParse, std::string &fileConf, Logger *log, int numberOfFields, Graph *graph);

	/**
	 * Metodo que inicia la validacion de los nodos ingresantes.
	 */
	void validate();

	/**
	 * Metodo que valida la cantidad de campos del nodo ingresante.
	 * @param lineCount de tipo int.
	 * @param fieldAmount de tipo int.
	 */
	void validateNumberOfFields(int lineCount, int fieldAmount);

	/**
	 * Metodo que valida el tipo del campo del nodo ingresante.
	 * @param lineCount de tipo int.
	 * @param fieldNumber de tipo int.
	 * @param field de clase std::string.
	 */
	void validateField(int lineCount, int fieldNumber, std::string field);

	/**
	 * Metodo que valida la insercion del nodo en el grafo.
	 * @param lineCount de tipo int.
	 */
	void validateGraphElementAdding(int lineCount);
};

#endif /* NODEVALIDATOR_HPP_ */
